#include "../mqserver/mq_message.hpp"
#include <gtest/gtest.h>

mymq::MessgeManager::ptr mmp;
class MessageTest : public testing::Environment
{
public:
    virtual void SetUp() override
    {
        mmp = std::make_shared<mymq::MessgeManager>("./data/message");
        mmp->initQueueMessage("queue1");
    }

    virtual void TearDown() override
    {
        // mmp->clear();
    }
};


// 恢复历史消息
// TEST(message_test, recovery_test)
// {
//     ASSERT_EQ(mmp->getable_count("queue1"), 4);

//     mymq::MessagePtr msg1 = mmp->front("queue1");
//     ASSERT_NE(msg1.get(), nullptr);
//     ASSERT_EQ(msg1->payload().body(), "hello world 1");
//     ASSERT_EQ(mmp->getable_count("queue1"), 3);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 1);

//     mymq::MessagePtr msg2 = mmp->front("queue1");
//     ASSERT_NE(msg2.get(), nullptr);
//     ASSERT_EQ(msg2->payload().body(), "hello world 2");
//     ASSERT_EQ(mmp->getable_count("queue1"), 2);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 2);

//     mymq::MessagePtr msg3 = mmp->front("queue1");
//     ASSERT_NE(msg3.get(), nullptr);
//     ASSERT_EQ(msg3->payload().body(), "hello world 3");
//     ASSERT_EQ(mmp->getable_count("queue1"), 1);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 3);

//     mymq::MessagePtr msg4 = mmp->front("queue1");
//     ASSERT_NE(msg4.get(), nullptr);
//     ASSERT_EQ(msg4->payload().body(), "hello world 4");
//     ASSERT_EQ(mmp->getable_count("queue1"), 0);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 4);
// }

// TEST(message_test, destroy_test)
// {
//     mmp->destroyQueueMessage("queue1");
// }
// 插入测试，先不进行确认。查看 可获取消息数量 持久化消息数量
TEST(message_test, insert_test)
{
    mymq::BasicProperties bp;
    bp.set_id(mymq::UUIDHelper::uuid());
    bp.set_delivery_mode(mymq::DeliveryMode::DURABLE);
    bp.set_routing_key("news.music.pop");
    mmp->insert("queue1", &bp, "hello world 1", true);
    mmp->insert("queue1", nullptr, "hello world 2", true);
    mmp->insert("queue1", nullptr, "hello world 3", true);
    mmp->insert("queue1", nullptr, "hello world 4", true);
    mmp->insert("queue1", nullptr, "hello world 5", false);

    ASSERT_EQ(mmp->getable_count("queue1"), 5);
    ASSERT_EQ(mmp->waitack_count("queue1"), 0);
    ASSERT_EQ(mmp->durable_count("queue1"), 4);
    ASSERT_EQ(mmp->total_count("queue1"), 4);
}

// 删除测试：取出一条消息，查看 可获取消息数量 待确认消息数量；确认消息，查看待确认消息数 有效持久化数量 总持久化数量
TEST(message_test, ack_test)
{
    ASSERT_EQ(mmp->getable_count("queue1"), 5);

    mymq::MessagePtr msg1 = mmp->front("queue1");
    // ASSERT_NE(msg1.get(), nullptr);
    // ASSERT_EQ(msg1->payload().body(), std::string("hello world 1"));
    // ASSERT_EQ(mmp->getable_count("queue1"), 4);
    // ASSERT_EQ(mmp->waitack_count("queue1"), 1);
    mmp->ack("queue1", msg1->payload().properties().id());
    // std::cout << msg1->payload().properties().id() << std::endl;
    // ASSERT_EQ(mmp->waitack_count("queue1"), 0);
    // ASSERT_EQ(mmp->durable_count("queue1"), 3);
    // ASSERT_EQ(mmp->total_count("queue1"), 4);

    mymq::MessagePtr msg2 = mmp->front("queue1");
    // std::cout << msg2->payload().properties().id() << std::endl;
    mmp->ack("queue1", msg2->payload().properties().id());
    // ASSERT_EQ(mmp->durable_count("queue1"), 2);
    // ASSERT_EQ(mmp->total_count("queue1"), 4);
    mymq::MessagePtr msg3 = mmp->front("queue1");
    mmp->ack("queue1", msg3->payload().properties().id());


}
// 获取消息测试，获取一条消息，查看 可获取消息数量 待确认消息数量
// TEST(message_test, select_test)
// {
//     ASSERT_EQ(mmp->getable_count("queue1"), 5);

//     mymq::MessagePtr msg1 = mmp->front("queue1");
//     ASSERT_NE(msg1.get(), nullptr);
//     ASSERT_EQ(msg1->payload().body(), "hello world 1");
//     ASSERT_EQ(mmp->getable_count("queue1"), 4);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 1);

//     mymq::MessagePtr msg2 = mmp->front("queue1");
//     ASSERT_NE(msg2.get(), nullptr);
//     ASSERT_EQ(msg2->payload().body(), "hello world 2");
//     ASSERT_EQ(mmp->getable_count("queue1"), 3);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 2);

//     mymq::MessagePtr msg3 = mmp->front("queue1");
//     ASSERT_NE(msg3.get(), nullptr);
//     ASSERT_EQ(msg3->payload().body(), "hello world 3");
//     ASSERT_EQ(mmp->getable_count("queue1"), 2);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 3);

//     mymq::MessagePtr msg4 = mmp->front("queue1");
//     ASSERT_NE(msg4.get(), nullptr);
//     ASSERT_EQ(msg4->payload().body(), "hello world 4");
//     ASSERT_EQ(mmp->getable_count("queue1"), 1);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 4);

//     mymq::MessagePtr msg5 = mmp->front("queue1");
//     ASSERT_NE(msg5.get(), nullptr);
//     ASSERT_EQ(msg5->payload().body(), "hello world 5");
//     ASSERT_EQ(mmp->getable_count("queue1"), 0);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 5);
// }



int main()
{
    testing::InitGoogleTest();
    testing::AddGlobalTestEnvironment(new MessageTest);
    RUN_ALL_TESTS();
    return 0;
}